using System;
using WaterQualityReportSystem.utils;

namespace WaterQualityReportSystem
{
    /// <summary>
    /// 滴定试剂法硬度检测仪测试数据生成器
    /// </summary>
    public static class HardnessTestData
    {
        /// <summary>
        /// 生成 ModBus-RTU 格式的硬度测试数据
        /// </summary>
        /// <param name="hardnessValue">硬度值 (mg/L)</param>
        /// <param name="deviceAddress">设备地址 (默认 0x01)</param>
        /// <returns>十六进制字符串格式的测试数据</returns>
        public static string GenerateHardnessTestData(float hardnessValue, byte deviceAddress = 0x01)
        {
            // 将浮点数转换为 32 位字节数组 (Big-Endian 格式)
            byte[] floatBytes = BitConverter.GetBytes(hardnessValue);
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(floatBytes);
            }

            // 构建 ModBus-RTU 响应数据
            // 格式: 设备地址(1) + 功能码(1) + 字节数(1) + 数据(4) + CRC16(2)
            byte[] response = new byte[9];
            response[0] = deviceAddress;        // 设备地址
            response[1] = 0x03;                 // 功能码 (读保持寄存器)
            response[2] = 0x04;                 // 字节数
            response[3] = floatBytes[0];        // 数据高字节
            response[4] = floatBytes[1];        // 数据次高字节
            response[5] = floatBytes[2];        // 数据次低字节
            response[6] = floatBytes[3];        // 数据低字节

            // 计算 CRC16 校验码
            byte[] dataForCrc = new byte[7];
            Array.Copy(response, 0, dataForCrc, 0, 7);
            ushort crc = ModBusRTUHelper.CalculateCRC16(dataForCrc);
            response[7] = (byte)(crc & 0xFF);        // CRC 低字节
            response[8] = (byte)((crc >> 8) & 0xFF); // CRC 高字节

            // 转换为十六进制字符串
            return BitConverter.ToString(response).Replace("-", "");
        }

        /// <summary>
        /// 获取预定义的测试数据列表
        /// </summary>
        /// <returns>测试数据数组</returns>
        public static string[] GetTestDataList()
        {
            return new string[]
            {
                GenerateHardnessTestData(88.18f),    // 测试数据1: 88.18 mg/L
                GenerateHardnessTestData(125.45f),   // 测试数据2: 125.45 mg/L
                GenerateHardnessTestData(67.32f),    // 测试数据3: 67.32 mg/L
                GenerateHardnessTestData(156.78f),   // 测试数据4: 156.78 mg/L
                GenerateHardnessTestData(92.15f),    // 测试数据5: 92.15 mg/L
                GenerateHardnessTestData(203.67f),   // 测试数据6: 203.67 mg/L
                GenerateHardnessTestData(45.89f),    // 测试数据7: 45.89 mg/L
                GenerateHardnessTestData(178.23f),    // 测试数据8: 178.23 mg/L
                "01 03 04 44 9A 40 00 FF 2C".Replace(" ","")
            };
        }

        /// <summary>
        /// 获取测试数据描述
        /// </summary>
        /// <returns>测试数据描述数组</returns>
        public static string[] GetTestDataDescriptions()
        {
            return new string[]
            {
                "硬度测试数据1 (88.18 mg/L)",
                "硬度测试数据2 (125.45 mg/L)",
                "硬度测试数据3 (67.32 mg/L)",
                "硬度测试数据4 (156.78 mg/L)",
                "硬度测试数据5 (92.15 mg/L)",
                "硬度测试数据6 (203.67 mg/L)",
                "硬度测试数据7 (45.89 mg/L)",
                "硬度测试数据8 (178.23 mg/L)",
                "真实数据"
            };
        }
    }
}